package com.ctshk.rpc.order.air.service;

import com.ctshk.common.dto.Result;
import com.ctshk.common.dto.payment.CallPayDTO;
import com.ctshk.common.model.PageResponse;
import com.ctshk.common.model.TokenUser;
import com.ctshk.common.req.pay.NotifyConsumeReq;
import com.ctshk.common.vo.OrderRefundDTO;
import com.ctshk.rpc.order.air.dto.AirOrderDTO;
import com.ctshk.rpc.order.air.dto.AirOrderInfoDTO;
import com.ctshk.rpc.order.air.dto.AirOrderListDTO;
import com.ctshk.rpc.order.air.req.*;
import com.ctshk.rpc.order.air.req.orderDetail.AirOrderUpdateTouristData;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 机票订单 服务类
 * </p>
 *
 * @author lihang
 * @since 2021-03-15
 */
public interface IAirOrderService{


    /**
     * 新增机票订单
     * @param req
     * @param tokenUser
     * @return
     */
    Result addOrder(AirOrderAddReq req, TokenUser tokenUser) ;


    /**
     * 新增机票外挂订单
     * @param req
     * @param tokenUser
     * @return
     */
    Result addManualOrder(AirManualOrderAddReq req,TokenUser tokenUser);


    /**
     * 支付订单/收款
     * @param req
     * @param tokenUser
     * @return
     */
    Result payOrder(AirOrderPayReq req, TokenUser tokenUser);

    Result payment(NotifyConsumeReq notifyConsumeReq) throws Exception;

    /**
     * 取消订单/退款
     * @param req
     * @param tokenUser
     * @return
     */
    Result refundOrder(AirOrderRefundReq req,TokenUser tokenUser);

    /**
     * 未付款订单直接取消订单
     * @param req
     * @param tokenUser
     * @return
     */
    Result cancelOrder(AirOrderCancelReq req,TokenUser tokenUser);

    /**
     * 退款审批
     * @param req
     * @param tokenUser
     * @return
     */
    Result refundApproval(AirOrderRefundApprovalReq req,TokenUser tokenUser);

    /**
     * 订单退款确认
     * @param id
     * @param tokenUser
     * @return
     */
    Result refundConfirm(Long id,TokenUser tokenUser);

    /**
     * 订单退款确认 (内部接口)
     * @To 财务系统
     * @param refundNumber 退款单号
     * @param tokenUser
     * @return
     */
    Result refundConfirm(String refundNumber,TokenUser tokenUser);


    /**
     * 查询订单列表
     * @param req
     * @return
     */
    Result<PageResponse<AirOrderListDTO>> list(AirOrderListReq req);

    /**
     * 订单详情
     * @param id
     * @return
     */
    Result<AirOrderInfoDTO> info(Long id);

    /**
     * 更新旅客信息
     * @param airOrderUpdateTouristData
     * @return
     */
    Result updateTouristInfo(AirOrderUpdateTouristData airOrderUpdateTouristData);

    /**
     * 通知旅客
     * @param sendMessageToTouristReq
     * @return
     */
    Result sendMessageToTourist(AirOrderSendMessageToTouristReq sendMessageToTouristReq);

    /**
     * 确认订单
     * @param req
     * @return
     */
    Result confirmOrder(AirOrderConfirmOrderReq req);


    /**
     * 收款认款通知(内部接口)
     * @To 财务系统
     * @param req
     * @return
     */
    Result receivePaymentConfirm(ReceivePaymentConfirmReq req);

    /**
     * 批量确认收款
     * (内部接口)
     * @To 财务系统
     * @param collectionNumberList
     * @return
     */
    Result confirmPayment(List<String> collectionNumberList);

    /**
     * 再次确认收款
     * @param req
     * @param currentUser
     * @return
     */
    Result reconfirmThePayment(ReconfirmThePaymentReq req, TokenUser currentUser);

    /**
     * 锁定产品库存(内部接口)
     * @To 套票服务
     * @param req
     * @param tokenUser
     * @return
     */
    Result lockInventory(LockInventoryReq req,TokenUser tokenUser);

    /**
     * 释放库存(内部接口)
     * @To 套票服务
     * @param productId
     * @param orderId
     * @return
     */
    Result releaseInventory(Long productId, Long orderId);

    /**
     * 获取退款明细列表(内部接口)
     * @To 财务中心
     * @param refundNumber 退款单号
     * @return
     */
    Result<List<OrderRefundDTO>> getOrderRefundList(String refundNumber);

    /**
     * 供应商确认订单
     * @param req
     * @param userId
     * @return
     */
    Result supplierConfirmOrder(SupplierConfirmOrderReq req, Long userId);

    /**
     * 最近一次查询结束时间到当前时间的数据
     */
    Result<List<AirOrderListDTO>> recentToNow(LocalDateTime recent, LocalDateTime now);

    /**
     * 支付模块查询订单信息
     * @param orderId
     * @return
     */
    CallPayDTO getCallPayInfo(Long orderId);

    /**
     * 最近一次查询结束时间到当前时间的订单DTO
     */
    List<AirOrderDTO> queryOrderDTOList(LocalDateTime start, LocalDateTime end);
}
